package reflect01;

import org.junit.Test;

import java.lang.reflect.Method;

/**
 *反射(解刨出)成员方法:
 *  Class类中的成员方法:
 *         public Method getMethod(String name, Class<?>... parameterTypes)
 *         name:代表方法名
 *         parameterTypes:代表方法的形参列表,如果为空参则不传入
 *         getMethod()将获取到的公有的方法信息封装到Method对象中
 *   Method类中的方法:
 *         public Object invoke(Object obj, Object... args)
 *         obj:代表要调用的方法所属的类的对象
 *         args:调用该方法传入的实际参数
 *         通过反射的形式调用方法
 *         如果该方法定义的返回值类型为void,那么invoke就返回null
 */
public class ReflectDemo03 {
    @Test
    public void teatMethod01()throws Exception{
        //1.获取字节码对象
        Class<Person> pCls =(Class<Person>) Class.forName("reflect01.Person");

        //2.获取指定的成员方法(sleep方法)
        Method sleepMethod = pCls.getMethod("sleep");

        //3.通过对象以及invoke来调用方法
        Person person = pCls.getConstructor().newInstance();//类比: Person person =new Person();
        Object returnVal = sleepMethod.invoke(person);//类比: person.sleep();
        System.out.println(returnVal);//如果该方法定义的返回值类型为void,那么invoke就返回null
    }

    @Test
    public void testMethod02()throws Exception{
        //1.获取字节码对象
        Class<Person> pCls =(Class<Person>) Class.forName("reflect01.Person");

        //2.获取指定的成员方法(sleep方法)
        Method eatMethod = pCls.getMethod("eat",String.class);

        //3.通过对象以及invoke来调用方法
        Person person = pCls.getConstructor().newInstance();//类比: Person person =new Person();
        Object returnVal = eatMethod.invoke(person,"榴莲");//类似: person.eat("榴莲")
        System.out.println(returnVal);//如果该方法定义的返回值类型为void,那么invoke就返回null
    }
}
